MVVM প্যাটার্নে Validation এবং Error Handling অ্যাপ্লিকেশনের ডেটার সঠিকতা নিশ্চিত করতে এবং ব্যবহারকারীর জন্য একটি মসৃণ, নির্ভরযোগ্য অভিজ্ঞতা প্রদান করতে অত্যন্ত গুরুত্বপূর্ণ। Validation এবং Error Handling একে অপরের পরিপূরক, যেখানে Validation ডেটার বৈধতা যাচাই করে এবং Error Handling সিস্টেমের মধ্যে সম্ভাব্য ত্রুটি বা এক্সেপশন পরিচালনা করে।
Validation একটি প্রক্রিয়া যার মাধ্যমে ইনপুট ডেটার সঠিকতা এবং অখণ্ডতা নিশ্চিত করা হয়। এটি ডেটার Model স্তরে হতে পারে এবং ViewModel এ Command বা UI থেকে ইনপুট সংগ্রহের সময় করা হয়।
Data Annotations:
উদাহরণ:
public class Product
{
[Required(ErrorMessage = "Product name is required")]
[StringLength(100, ErrorMessage = "Name cannot exceed 100 characters")]
public string Name { get; set; }
[Range(0.1, 10000, ErrorMessage = "Price must be between 0.1 and 10,000")]
public decimal Price { get; set; }
}
এখানে Product মডেলের প্রপার্টি গুলোর উপর Required এবং Range অ্যাট্রিবিউট ব্যবহার করা হয়েছে।
INotifyDataErrorInfo:
উদাহরণ:
public class ProductViewModel : INotifyDataErrorInfo
{
private string _name;
private readonly Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
public string Name
{
get { return _name; }
set
{
_name = value;
ValidateName();
OnPropertyChanged(nameof(Name));
}
}
public bool HasErrors => _errors.Any();
public IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
return _errors.Values.SelectMany(e => e);
if (_errors.ContainsKey(propertyName))
return _errors[propertyName];
return null;
}
private void ValidateName()
{
if (string.IsNullOrEmpty(_name))
{
_errors[nameof(Name)] = new List<string> { "Name is required" };
}
else
{
_errors.Remove(nameof(Name));
}
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
}
এই উদাহরণে, INotifyDataErrorInfo ইন্টারফেস ব্যবহার করে ProductViewModel-এ নামের জন্য একটি ভ্যালিডেশন লজিক তৈরি করা হয়েছে।
Custom Validation Logic:
উদাহরণ:
public bool ValidateProduct(Product product)
{
if (product.Price <= 0)
{
// Custom validation error
return false;
}
return true;
}
Error Handling এমন একটি প্রক্রিয়া যা অ্যাপ্লিকেশনে ভুল বা এক্সেপশন ঘটলে সেগুলিকে পরিচালনা করতে সহায়ক হয়, যাতে ব্যবহারকারী বুঝতে পারে কি সমস্যা হয়েছে এবং অ্যাপ্লিকেশনটি সঠিকভাবে কাজ করতে পারে।
Try-Catch Blocks:
উদাহরণ:
public void UpdatePrice(decimal newPrice)
{
try
{
_product.Price = newPrice;
// Save to database or perform additional operations
}
catch (Exception ex)
{
// Handle the error (log, show message, etc.)
LogError(ex);
}
}
এখানে Try-Catch ব্লক ব্যবহার করে, প্রাইস আপডেট করার সময় কোনো ত্রুটি ঘটলে তা হ্যান্ডেল করা হয়েছে।
Global Error Handling:
WPF Example:
Application.Current.DispatcherUnhandledException += (sender, e) =>
{
MessageBox.Show($"An error occurred: {e.Exception.Message}");
e.Handled = true; // Mark the exception as handled
};
এই কোডে, যেকোনো আনহ্যান্ডেলড এক্সেপশনকে DispatcherUnhandledException ইভেন্টের মাধ্যমে হ্যান্ডল করা হয়েছে।
Error Logging:
উদাহরণ:
public void LogError(Exception ex)
{
var logger = LogManager.GetLogger("ErrorLogger");
logger.Error(ex, "An error occurred while updating the price.");
}
এখানে LogManager ব্যবহার করে ত্রুটি লগ করা হয়েছে যাতে ভবিষ্যতে ডিবাগিং বা সমস্যা সমাধান সহজ হয়।
User-Friendly Error Messages:
উদাহরণ:
public void DisplayError(string message)
{
// Display error message to the user
MessageBox.Show(message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
এখানে MessageBox ব্যবহার করে ব্যবহারকারীকে ত্রুটি বার্তা প্রদর্শন করা হয়েছে।
Validation এবং Error Handling অ্যাপ্লিকেশনটির নির্ভরযোগ্যতা এবং ব্যবহারকারী অভিজ্ঞতা নিশ্চিত করতে অত্যন্ত গুরুত্বপূর্ণ। Validation নিশ্চিত করে যে ডেটা সঠিক এবং উপযুক্ত, যখন Error Handling ত্রুটির কারণ নির্ধারণ এবং তা সমাধান করার জন্য প্রক্রিয়া প্রদান করে। এই দুটি প্রক্রিয়া সম্মিলিতভাবে ব্যবহারকারীর জন্য একটি মসৃণ, ত্রুটি মুক্ত অভিজ্ঞতা নিশ্চিত করতে সাহায্য করে।
IDataErrorInfo এবং INotifyDataErrorInfo দুটি ইন্টারফেস MVVM প্যাটার্নে ডেটা ভ্যালিডেশন (Data Validation) করার জন্য ব্যবহৃত হয়। যখন একটি অ্যাপ্লিকেশন ইউজার ইনপুট নেয়, তখন ডেটা সঠিক কিনা তা যাচাই করা অত্যন্ত গুরুত্বপূর্ণ। এই দুইটি ইন্টারফেস আপনাকে আপনার অ্যাপ্লিকেশন ডেটার ভ্যালিডেশন ম্যানেজ করতে সাহায্য করে, এবং MVVM প্যাটার্নে ViewModel-এ এই ভ্যালিডেশনকে ইনক্লুড করা হয়।
IDataErrorInfo ইন্টারফেসটি একটি সিঙ্গল প্রপার্টি এবং একটি মেথড প্রদান করে, যা UI কে জানাতে সাহায্য করে যে কোনো প্রপার্টি বৈধ কিনা। যখন কোনো ViewModel এর প্রপার্টি ত্রুটি ঘটায়, তখন IDataErrorInfo এর মাধ্যমে একটি ত্রুটি বার্তা প্রদর্শন করা হয়। এটি সাধারণত সিঙ্গেল প্রপার্টির ভিত্তিতে ত্রুটি যাচাইয়ের জন্য ব্যবহৃত হয়।
public class Product : IDataErrorInfo
{
private string _name;
private decimal _price;
public string Name
{
get { return _name; }
set { _name = value; }
}
public decimal Price
{
get { return _price; }
set { _price = value; }
}
public string Error
{
get { return "There are some errors in the product."; }
}
public string this[string columnName]
{
get
{
string errorMessage = null;
// Checking for validation on 'Name'
if (columnName == "Name" && string.IsNullOrEmpty(_name))
{
errorMessage = "Name cannot be empty.";
}
// Checking for validation on 'Price'
if (columnName == "Price" && _price <= 0)
{
errorMessage = "Price must be greater than zero.";
}
return errorMessage;
}
}
}
এখানে:
this[string columnName]
) নির্দিষ্ট প্রপার্টি অনুযায়ী ত্রুটি বার্তা প্রদান করে।IDataErrorInfo এর মাধ্যমে ViewModel এর প্রপার্টি ভ্যালিডেশনের ত্রুটি পরিচালনা করা যায়, এবং View তে ওই ত্রুটির বার্তা প্রদর্শন করা হয়।
INotifyDataErrorInfo ইন্টারফেসটি IDataErrorInfo এর মতোই কাজ করে, তবে এতে কিছু উন্নত ফিচার রয়েছে। INotifyDataErrorInfo একটি ইভেন্টের মাধ্যমে ডেটা ত্রুটি পরিবর্তন সিগন্যাল পাঠাতে সাহায্য করে, যাতে UI তে ত্রুটি বার্তা সহজে আপডেট করা যায়। এটি বিশেষভাবে যখন ভ্যালিডেশন পরিবর্তিত হয়, তখন UI কে জানাতে সহায়ক হয়, যেমন একটি ফর্মে কোনো ত্রুটি ঘটলে তা সঠিকভাবে প্রতিফলিত হয়।
public class Product : INotifyDataErrorInfo
{
private string _name;
private decimal _price;
private Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
public string Name
{
get { return _name; }
set
{
_name = value;
ValidateName();
}
}
public decimal Price
{
get { return _price; }
set
{
_price = value;
ValidatePrice();
}
}
public bool HasErrors => _errors.Any();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public IEnumerable GetErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
return _errors[propertyName];
}
return null;
}
private void ValidateName()
{
if (string.IsNullOrEmpty(_name))
{
AddError("Name", "Name cannot be empty.");
}
else
{
RemoveError("Name");
}
}
private void ValidatePrice()
{
if (_price <= 0)
{
AddError("Price", "Price must be greater than zero.");
}
else
{
RemoveError("Price");
}
}
private void AddError(string propertyName, string error)
{
if (!_errors.ContainsKey(propertyName))
{
_errors[propertyName] = new List<string>();
}
if (!_errors[propertyName].Contains(error))
{
_errors[propertyName].Add(error);
OnErrorsChanged(propertyName);
}
}
private void RemoveError(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
_errors[propertyName].Clear();
OnErrorsChanged(propertyName);
}
}
private void OnErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
}
এখানে:
true
বা false
রিটার্ন করবে।IDataErrorInfo এবং INotifyDataErrorInfo দুটি ইন্টারফেস ডেটা ভ্যালিডেশন পরিচালনা করতে ব্যবহৃত হয়। IDataErrorInfo সরল এবং সোজা ইন্টারফেস, যা মূলত প্রপার্টির জন্য ভ্যালিডেশন বার্তা সরবরাহ করে। অন্যদিকে, INotifyDataErrorInfo উন্নত এবং ডাইনামিক ভ্যালিডেশন ম্যানেজমেন্ট সরবরাহ করে, যা UI তে ত্রুটি আপডেট করার জন্য ইভেন্ট ব্যবহার করে। MVVM প্যাটার্নে এই ইন্টারফেসগুলো ViewModel এর মধ্যে ডেটা ভ্যালিডেশন নিশ্চিত করতে ব্যবহৃত হয়, যাতে ব্যবহারকারীর ইনপুট ত্রুটি শোধরানো যায়।
MVVM (Model-View-ViewModel) প্যাটার্নে Validation হল এমন একটি প্রক্রিয়া যেখানে ব্যবহারকারীর ইনপুট ডেটা যাচাই করা হয়, যাতে অ্যাপ্লিকেশনটি সঠিক ডেটা প্রক্রিয়া করতে পারে। Validation Rules সাধারণত ViewModel বা Model-এ নির্ধারিত হয় এবং ইউজারের ইনপুট ডেটা সঠিক কিনা তা যাচাই করার জন্য ব্যবহৃত হয়। Custom Validation Logic ব্যবহারকারীর নির্দিষ্ট চাহিদা অনুসারে প্রক্রিয়া তৈরি করার জন্য ব্যবহৃত হয়, যেমন একটি নির্দিষ্ট ক্ষেত্রের জন্য কাস্টম নিয়ম তৈরি করা।
Validation Rules হল এমন নিয়ম যা ইনপুট ডেটা যাচাই করে দেখে, এটি সঠিক কিনা। MVVM প্যাটার্নে, এই validation সাধারণত ViewModel-এ পরিচালিত হয় এবং Binding এর মাধ্যমে View তে প্রয়োগ করা হয়। একাধিক প্রকারের ভ্যালিডেশন রুলস ব্যবহৃত হতে পারে, যেমন:
ধরা যাক, একটি ফর্মে ইউজার নাম এবং ইমেইল ইনপুট ফিল্ড রয়েছে এবং আমরা চাই যে:
public class UserViewModel : INotifyPropertyChanged
{
private string _username;
public string Username
{
get { return _username; }
set { _username = value; OnPropertyChanged(); }
}
public bool IsUsernameValid()
{
return !string.IsNullOrEmpty(Username);
}
}
public class UserViewModel : INotifyPropertyChanged
{
private string _email;
public string Email
{
get { return _email; }
set { _email = value; OnPropertyChanged(); }
}
public bool IsEmailValid()
{
var emailPattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
return Regex.IsMatch(Email, emailPattern);
}
}
এখানে, IsUsernameValid() এবং IsEmailValid() মেথডগুলি ব্যবহারকারীর ইনপুট যাচাই করবে।
Custom Validation Logic ব্যবহারকারীর চাহিদা অনুযায়ী তৈরি করা যেতে পারে, যা ডেটা যাচাই করার জন্য কাস্টম নিয়ম বা শর্ত নির্ধারণ করে। এটি সাধারণত complex validation প্রয়োজন যেখানে একাধিক শর্ত একসাথে প্রয়োগ করতে হয়।
ধরা যাক, একটি পাসওয়ার্ড ফিল্ড রয়েছে এবং আমরা চাই যে পাসওয়ার্ডটি অন্তত ৮টি অক্ষর, একটি বড় হাতের অক্ষর, একটি ছোট হাতের অক্ষর এবং একটি সংখ্যা থাকতে হবে।
public class UserViewModel : INotifyPropertyChanged
{
private string _password;
public string Password
{
get { return _password; }
set { _password = value; OnPropertyChanged(); }
}
public bool IsPasswordValid()
{
if (string.IsNullOrEmpty(Password))
{
return false;
}
bool hasUpper = Password.Any(char.IsUpper);
bool hasLower = Password.Any(char.IsLower);
bool hasDigit = Password.Any(char.IsDigit);
bool hasMinimumLength = Password.Length >= 8;
return hasUpper && hasLower && hasDigit && hasMinimumLength;
}
}
এখানে, IsPasswordValid() মেথডটি পাসওয়ার্ডে বিভিন্ন শর্ত যাচাই করে, যেমন বড় হাতের অক্ষর, ছোট হাতের অক্ষর, সংখ্যা এবং ন্যূনতম দৈর্ঘ্য।
MVVM প্যাটার্নে Data Binding এবং Validation একে অপরের সাথে কাজ করতে পারে। যখন View-এর Binding ভ্যালিডেশন মেথডের সাথে সংযুক্ত থাকে, তখন ব্যবহারকারীর ইনপুট যাচাই করা হয় এবং যদি তা ভুল হয় তবে ব্যবহারকারীকে সঠিকভাবে ইনপুট করার জন্য সতর্ক করা হয়।
<TextBox Text="{Binding Username, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding UsernameError}" Foreground="Red"/>
এখানে, TextBox এর Text প্রোপার্টি Username প্রোপার্টির সাথে বেঁধে দেওয়া হয়েছে এবং যদি কোন ত্রুটি ঘটে, তবে তা UsernameError এর মাধ্যমে প্রদর্শিত হবে।
INotifyDataErrorInfo ইন্টারফেসটি একটি ইন্টারফেস যা ডেটা ভ্যালিডেশন সম্পর্কিত ত্রুটির পরিচালনা করতে ব্যবহৃত হয়। এটি MVVM প্যাটার্নে ভ্যালিডেশন করতে বিশেষভাবে উপকারী, কারণ এটি ViewModel এ ত্রুটি তথ্য সরবরাহ করে এবং View তে ত্রুটি বার্তা প্রদর্শন করতে সক্ষম করে।
public class UserViewModel : INotifyDataErrorInfo
{
private string _username;
private Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
public string Username
{
get { return _username; }
set
{
_username = value;
ValidateUsername();
OnPropertyChanged();
}
}
private void ValidateUsername()
{
if (string.IsNullOrEmpty(Username))
{
AddError("Username", "Username is required.");
}
else
{
RemoveError("Username");
}
}
private void AddError(string propertyName, string error)
{
if (!_errors.ContainsKey(propertyName))
{
_errors[propertyName] = new List<string>();
}
_errors[propertyName].Add(error);
OnPropertyChanged(nameof(HasErrors));
}
private void RemoveError(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
_errors[propertyName].Clear();
OnPropertyChanged(nameof(HasErrors));
}
}
public bool HasErrors => _errors.Any();
public IEnumerable<string> GetErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
return _errors[propertyName];
}
return null;
}
}
এখানে, INotifyDataErrorInfo ইন্টারফেসের GetErrors() মেথড ব্যবহার করে Username প্রোপার্টির জন্য ত্রুটি বার্তা ফেরত দেওয়া হচ্ছে।
Validation এবং Custom Validation Logic MVVM প্যাটার্নে একটি অত্যন্ত গুরুত্বপূর্ণ অংশ। ব্যবহারকারী ইনপুট যাচাই করার জন্য Validation Rules এবং Custom Validation এর মাধ্যমে অ্যাপ্লিকেশনটিকে আরো নিরাপদ এবং ব্যবহারকারী-বান্ধব করা সম্ভব। INotifyDataErrorInfo ইন্টারফেস ব্যবহার করে সেন্ট্রালাইজড এবং ইউনিফাইড ত্রুটি পরিচালনা সহজ হয়, যা UI তে ত্রুটি বার্তা প্রদর্শন করতে সহায়ক।
Validation হল ডেটা ইনপুটের সঠিকতা পরীক্ষা করার একটি প্রক্রিয়া। MVVM প্যাটার্নে, ডেটা ভ্যালিডেশন সাধারণত ViewModel বা Model-এ করা হয় এবং তার ফলাফল View-এ প্রদর্শিত হয়। Validation Summary এবং Error Templates হল দুটি উপায় যার মাধ্যমে ব্যবহারকারীর কাছে সঠিকভাবে ভ্যালিডেশন বার্তা এবং ইনপুট ফিল্ডের ত্রুটি দেখানো হয়।
এখানে Validation Summary এবং Error Templates তৈরি এবং কিভাবে এগুলি MVVM প্যাটার্নে ব্যবহার করা হয়, তা নিয়ে বিস্তারিত আলোচনা করা হয়েছে।
Validation Summary হলো একটি তালিকা বা সারাংশ, যা View-এ সমস্ত ত্রুটি বা ভ্যালিডেশন বার্তা প্রদর্শন করতে ব্যবহৃত হয়। এটি সাধারণত একটি TextBlock বা ListBox ব্যবহার করে তৈরি করা হয়, যেখানে সমস্ত ভ্যালিডেশন ত্রুটি একসাথে প্রদর্শিত হয়।
আপনি যখন Validation Summary তৈরি করতে চান, তখন Validation.Errors কালেকশন ব্যবহার করতে পারেন, যা Binding
ত্রুটির তালিকা ধারণ করে। এটি View-এ প্রদর্শন করার জন্য সাধারণত ValidationSummary এর মতো একটি কাস্টম উপাদান ব্যবহার করা হয়।
XAML Example:
<Window x:Class="ValidationSummaryExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Validation Summary" Height="350" Width="525">
<Grid>
<!-- Validation Summary -->
<StackPanel>
<TextBlock Text="Validation Errors:" FontWeight="Bold" />
<ListBox Name="ErrorList" Height="150" />
</StackPanel>
<!-- Form Fields with Validation -->
<StackPanel VerticalAlignment="Top">
<TextBox Name="NameTextBox" Width="200" Margin="10"
Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<TextBox Name="EmailTextBox" Width="200" Margin="10"
Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<Button Content="Submit" Width="100" Height="30" Margin="10" />
</StackPanel>
</Grid>
</Window>
ViewModel Example:
public class MainViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private string _name;
private string _email;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged(); }
}
public string Email
{
get { return _email; }
set { _email = value; OnPropertyChanged(); }
}
public string Error => null;
public string this[string propertyName]
{
get
{
if (propertyName == nameof(Name) && string.IsNullOrWhiteSpace(Name))
return "Name cannot be empty.";
if (propertyName == nameof(Email) && !Email.Contains("@"))
return "Invalid email address.";
return null;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে IDataErrorInfo ইন্টারফেস ব্যবহার করে ডেটা ভ্যালিডেশন পরিচালিত হচ্ছে এবং Name এবং Email এর জন্য Error বার্তা সেট করা হচ্ছে। Validation.Errors কালেকশন View-এ ভ্যালিডেশন ত্রুটি প্রদর্শন করবে।
Error Templates হল এমন একটি কাস্টম UI উপাদান যা ত্রুটির ক্ষেত্রে ইনপুট ফিল্ডের সজ্জা পরিবর্তন করে, যেমন টেক্সট বক্সের চারপাশে লাল বর্ডার বা ত্রুটি বার্তা দেখানো। Error Templates ব্যবহার করে আপনি নির্দিষ্ট ইনপুট ফিল্ডের ত্রুটি ফিডব্যাক ব্যবহারকারীকে স্পষ্টভাবে প্রদান করতে পারেন।
Error Template তৈরি করতে ControlTemplate বা Style ব্যবহার করা হয়। আপনি Validation.HasError প্রপার্টি ব্যবহার করে একটি ইনপুট ফিল্ডের ত্রুটি পরীক্ষা করতে পারেন এবং ত্রুটির ভিত্তিতে UI পরিবর্তন করতে পারেন।
XAML Example:
<Window x:Class="ErrorTemplateExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Error Template" Height="350" Width="525">
<Window.Resources>
<Style x:Key="ErrorStyle" TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.HasError)}" Value="True">
<Setter Property="BorderBrush" Value="Red" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<!-- Form Fields with Error Template -->
<TextBox Width="200" Height="30" Margin="10"
Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Style="{StaticResource ErrorStyle}" />
<Button Content="Submit" Width="100" Height="30" Margin="10" />
</Grid>
</Window>
ViewModel Example:
public class MainViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged(); }
}
public string Error => null;
public string this[string propertyName]
{
get
{
if (propertyName == nameof(Name) && string.IsNullOrWhiteSpace(Name))
return "Name cannot be empty.";
return null;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে TextBox-এর চারপাশে লাল বর্ডার এবং একটি টুলটিপ সঠিকভাবে ত্রুটি বার্তা দেখানোর জন্য ErrorTemplate তৈরি করা হয়েছে। Validation.HasError ব্যবহার করে ত্রুটি চেক করা হচ্ছে, এবং ToolTip এ ত্রুটি বার্তা দেখানো হচ্ছে।
এভাবে MVVM প্যাটার্নে Validation Summary এবং Error Templates ব্যবহার করে অ্যাপ্লিকেশনের ডেটা ইনপুটের সঠিকতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করা যায়।
MVVM প্যাটার্নে Async Validation এবং Error Notification ব্যবহৃত হয় যখন অ্যাপ্লিকেশনের ভিউমডেল সঠিকভাবে ডেটা যাচাই করার পাশাপাশি ব্যবহারকারীকে ভুল তথ্য প্রদর্শন করতে চায়। Async Validation মূলত দীর্ঘস্থায়ী প্রক্রিয়া যেমন ডেটাবেস যাচাই, API কল, বা সার্ভার সাইড ভ্যালিডেশন হ্যান্ডেল করতে ব্যবহৃত হয়। এক্ষেত্রে, Error Notification ব্যবহারকারীকে সঠিকভাবে ফিডব্যাক দেয় যাতে তারা সমস্যা দ্রুত জানতে পারে এবং সংশোধন করতে পারে।
Async Validation হল সেই প্রক্রিয়া যেখানে ডেটা যাচাইয়ের কাজ একটি অ্যাসিঙ্ক্রোনাস (Asynchronous) পদ্ধতিতে করা হয়, যাতে ইউজার ইন্টারফেস (UI) স্ন্যাগ বা ফ্রিজ না হয়ে, স্বচ্ছন্দে কাজ চালিয়ে যেতে পারে। এক্ষেত্রে ViewModel-এ ICommand বা Task ব্যবহার করে ভ্যালিডেশন পরিচালিত হয়।
ধরা যাক, আমরা একটি Email ফিল্ড ভ্যালিডেট করতে চাই, যা একটি সার্ভার সাইড চেক (যেমন ইমেইল রেজিস্ট্রেশন চেক) সম্পাদন করবে।
public class RegistrationViewModel : INotifyPropertyChanged
{
private string _email;
private string _emailError;
private bool _isEmailValid;
public string Email
{
get => _email;
set
{
if (_email != value)
{
_email = value;
OnPropertyChanged();
ValidateEmailAsync();
}
}
}
public string EmailError
{
get => _emailError;
private set
{
if (_emailError != value)
{
_emailError = value;
OnPropertyChanged();
}
}
}
public bool IsEmailValid
{
get => _isEmailValid;
private set
{
if (_isEmailValid != value)
{
_isEmailValid = value;
OnPropertyChanged();
}
}
}
private async Task ValidateEmailAsync()
{
EmailError = string.Empty;
IsEmailValid = false;
if (string.IsNullOrEmpty(Email))
{
EmailError = "Email cannot be empty.";
return;
}
var isValid = await CheckEmailInDatabaseAsync(Email);
if (isValid)
{
IsEmailValid = true;
}
else
{
EmailError = "Email is already registered.";
}
}
private async Task<bool> CheckEmailInDatabaseAsync(string email)
{
// Fake async DB check (in real case, call API or database)
await Task.Delay(2000); // Simulating async task
return email != "existing@example.com"; // Fake check
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে, Email প্রপার্টি যখন পরিবর্তিত হবে, তখন ValidateEmailAsync কল করা হবে, যা ইমেইলটি সার্ভারের সাথে যাচাই করবে এবং ব্যবহারকারীর কাছে উপযুক্ত ভুল বার্তা (Error Message) দেখাবে।
<!-- XAML File (View) -->
<TextBox Text="{Binding Email}" />
<TextBlock Text="{Binding EmailError}" Foreground="Red" />
<Button Content="Register" Command="{Binding RegisterCommand}" IsEnabled="{Binding IsEmailValid}" />
এখানে, EmailError ত্রুটি বার্তাটি TextBlock এ দেখানো হচ্ছে, যা ValidateEmailAsync থেকে প্রাপ্ত হবে।
Error Notification টেকনিকটি ব্যবহৃত হয় যখন অ্যাপ্লিকেশনটিতে কোনো ত্রুটি ঘটলে তা ব্যবহারকারীকে দেখানোর প্রয়োজন হয়। এই ত্রুটির বার্তা সাধারণত ViewModel থেকে View-এ পাঠানো হয়। এ জন্য আপনি INotifyDataErrorInfo বা ValidationAttribute ব্যবহার করতে পারেন।
INotifyDataErrorInfo ইন্টারফেসের মাধ্যমে ViewModel-এ ডেটা ভ্যালিডেশন এবং এরর ম্যাসেজ গুলি View-এ সরবরাহ করা যায়। এই ইন্টারফেসের মাধ্যমে অ্যাসিঙ্ক্রোনাস বা সিনক্রোনাস ভ্যালিডেশন করতে পারবেন।
public class RegistrationViewModel : INotifyDataErrorInfo
{
private readonly Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
public bool HasErrors => _errors.Any();
public IEnumerable GetErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
return _errors[propertyName];
}
return null;
}
private string _email;
public string Email
{
get => _email;
set
{
if (_email != value)
{
_email = value;
ValidateEmail();
}
}
}
private void ValidateEmail()
{
ClearErrors(nameof(Email));
if (string.IsNullOrEmpty(Email))
{
AddError(nameof(Email), "Email cannot be empty.");
}
// Simulate async email check
if (Email == "existing@example.com")
{
AddError(nameof(Email), "Email is already registered.");
}
}
private void AddError(string propertyName, string error)
{
if (!_errors.ContainsKey(propertyName))
{
_errors[propertyName] = new List<string>();
}
_errors[propertyName].Add(error);
OnErrorsChanged(propertyName);
}
private void ClearErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
_errors[propertyName].Clear();
OnErrorsChanged(propertyName);
}
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
protected virtual void OnErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
}
এখানে, INotifyDataErrorInfo ইন্টারফেসটি Email প্রপার্টির জন্য ত্রুটি বার্তা প্রদান করে, এবং সেই ত্রুটির বার্তা View তে দেখানো হয়।
<!-- XAML File (View) -->
<TextBox Text="{Binding Email}" />
<TextBlock Text="{Binding Errors[Email]" Foreground="Red" />
<Button Content="Register" Command="{Binding RegisterCommand}" IsEnabled="{Binding IsEmailValid}" />
এখানে, TextBlock এর মাধ্যমে Email প্রপার্টির ত্রুটি বার্তা দেখানো হচ্ছে।
এভাবে Async Validation এবং Error Notification MVVM প্যাটার্নে ব্যবহারকারী ইন্টারঅ্যাকশন এবং অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে সাহায্য করে।
common.read_more